package com.vvv.designpattern.pay.facade;

import com.vvv.designpattern.pay.strategy.context.PayContext;
import com.vvv.designpattern.pay.strategy.factory.PayContextFactory;
import com.vvv.designpattern.pojo.Order;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * @author vvv
 * @date 2023-11-22 16 41
 * discription 门面模式：旨在封装，将一个业务模块封装后暴露一个入口给调用者调用，PayFacade为门面角色该角色暴露给调用者去调用的
 * 门面角色负责将客户端发来的请求转发到子系统中，
 * 这里我们是通过支付类型payType和order对象，在PayFacade先通过工厂类PayContextFactory获取payContext对象(策略模式的上下文对象）
 * 然后再将order传给payContext对象
 *
 * Q：为什么要引入工厂类？而不是直接在门面模式中用if else通过payType去创建context(new 创建 或者注入创建）
 * A：1. 门面模式是暴露给调用者调用的，所以我们不能频繁地修改他，所以我们要在门面模式中引用工厂类去创建对象
 */
@Component
public class PayFacade {

    @Resource
    private PayContextFactory payContextFactory;

    public String pay(Order order, Integer payType) {
        // 去工厂模式中获取context对象
        PayContext payContext = payContextFactory.getContext(payType);
        return payContext.execute(order);
    }
}
